package iText;

import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor;
import com.itextpdf.kernel.pdf.canvas.parser.listener.LocationTextExtractionStrategy;

import java.io.IOException;

public class ITextExtractAndOptimizeText {

    /**
     * 提取整个 PDF 文档的文本内容，并进行后处理优化
     *
     * @param filePath PDF 文件路径
     * @return 提取并优化后的文本内容
     */
    public static String extractAndOptimizeText(String filePath) throws IOException {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(filePath));
        StringBuilder allText = new StringBuilder();

        // 遍历所有页面
        for (int pageNumber = 1; pageNumber <= pdfDoc.getNumberOfPages(); pageNumber++) {
            PdfPage page = pdfDoc.getPage(pageNumber);

            // 定义文本提取策略
            LocationTextExtractionStrategy strategy = new LocationTextExtractionStrategy();

            // 处理页面内容
            PdfCanvasProcessor parser = new PdfCanvasProcessor(strategy);
            parser.processPageContent(page);

            // 获取当前页面的文本内容
            String pageText = strategy.getResultantText();
            allText.append(pageText).append("\n");
        }

        pdfDoc.close();

        // 对提取的文本进行后处理优化
        return optimizeText(allText.toString());
    }

    /**
     * 优化提取的文本
     *
     * @param text 原始文本
     * @return 优化后的文本
     */
    private static String optimizeText(String text) {
        // 1. 去除多余的空格和换行
        text = text.replaceAll("\\s+", " ").trim();

        // 2. 按段落拆分文本
        text = text.replaceAll("(\n\\s*){2,}", "\n\n"); // 将多个换行合并为一个段落分隔符

        // 3. 合并断开的单词
        text = text.replaceAll("(?<=\\w)-\n(?=\\w)", ""); // 合并因换行断开的单词

        // 4. 处理特殊字符（可选）
        text = text.replaceAll("[\\x00-\\x1F\\x7F]", ""); // 去除控制字符

        return text;
    }

    public static void main(String[] args) {
        try {
            String filePath = "D:\\test.pdf";
            String optimizedText = extractAndOptimizeText(filePath);
            System.out.println("Optimized Text:\n" + optimizedText);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}